package member

import (
	"gpt-api/framework/codes"
	"gpt-api/framework/ginplus"
	"gpt-api/pkg/model"
	"gpt-api/pkg/response"

	"github.com/gin-gonic/gin"
)

// 事件类型列表
func (h *Handler) ListEventTypes(c *gin.Context) error {
	userId := ginplus.GetUserID(c)
	eventTypes, err := (&model.EventType{}).GetEventTypes(h.db, uint(userId))
	if err != nil {
		return err
	}

	// 遍历数据
	resp := make([]response.EventTypeListResp, 0, len(eventTypes))
	for _, eventType := range eventTypes {
		resp = append(resp, response.EventTypeListResp{
			Id:     eventType.ID,
			Name:   eventType.Name,
			UserID: eventType.UserID,
		})
	}

	return ginplus.ReplyJSON(c, resp)
}

// 添加事件类型
func (h *Handler) AddEventType(c *gin.Context) error {
	// 验证参数
	userId := ginplus.GetUserID(c)
	var req struct {
		Name string `json:"name" binding:"required"`
		Id   uint   `json:"id" binding:"gte=0"`
	}
	if err := c.Bind(&req); err != nil {
		return ginplus.ReplyBadRequest(c, err)
	}

	// 整理数据
	eventType := model.EventType{
		Name:   req.Name,
		UserID: uint(userId),
	}

	// 如果传入ID，则更新
	if req.Id > 0 {
		eventType.ID = uint64(req.Id)

		// 验证旧数据
		oldEventType, err := eventType.GetEventType(h.db, req.Id)
		if err != nil {
			return ginplus.ReplyError(c, codes.EventTypeNotFound, err)
		}
		if uint64(oldEventType.UserID) != userId {
			return ginplus.ReplyError(c, codes.SystemEventTypeNotOperate, nil)
		}

		if err := eventType.Update(h.db); err != nil {
			return ginplus.ReplyInternalError(c, err)
		}
	} else {
		if err := eventType.Create(h.db); err != nil {
			return ginplus.ReplyInternalError(c, err)
		}
	}

	return ginplus.ReplyJSON(c, nil)
}

// 事件类型详情
func (h *Handler) GetEventType(c *gin.Context) error {
	userId := ginplus.GetUserID(c)
	var req struct {
		Id uint `form:"id" binding:"required,gte=0"`
	}
	if err := c.Bind(&req); err != nil {
		return ginplus.ReplyBadRequest(c, err)
	}

	// 查询
	eventType, err := (&model.EventType{}).GetEventType(h.db, req.Id)
	if err != nil {
		return ginplus.ReplyError(c, codes.EventTypeNotFound, err)
	}
	if eventType.UserID > 0 && uint64(eventType.UserID) != userId {
		return ginplus.ReplyError(c, codes.EventTypeNotFound, nil)
	}

	// 响应
	return ginplus.ReplyJSON(c, response.EventTypeInfoResp{
		Id:     eventType.ID,
		Name:   eventType.Name,
		UserID: eventType.UserID,
	})
}

// 删除事件类型
func (h *Handler) DeleteEventType(c *gin.Context) error {
	// 验证参数
	userId := ginplus.GetUserID(c)
	var req struct {
		Id uint `form:"id" binding:"required,gte=0"`
	}
	if err := c.Bind(&req); err != nil {
		return ginplus.ReplyBadRequest(c, err)
	}

	// 查询事件类型
	eventType, err := (&model.EventType{}).GetEventType(h.db, req.Id)
	if err != nil {
		return ginplus.ReplyError(c, codes.EventTypeNotFound, nil)
	}
	if uint64(eventType.UserID) != userId {
		return ginplus.ReplyError(c, codes.EventTypeNotFound, nil)
	}

	// 查询是否有事件
	existEvent, err := (&model.Events{}).GetEventsByEventTypeIdAndUserId(h.db, req.Id, uint(userId))
	if err != nil {
		return ginplus.ReplyInternalError(c, err)
	}
	if len(existEvent) > 0 {
		return ginplus.ReplyError(c, codes.MemberEventIsExist, nil)
	}

	// 执行删除
	if err := eventType.Delete(h.db); err != nil {
		return ginplus.ReplyInternalError(c, err)
	}

	return ginplus.ReplyJSON(c, nil)
}
